// packageA/pages/overtimeAdd/overtimeAdd.js
const app = getApp();
import CommonService from '../../../utils/service/commonService.js';
import Toast from '../../../miniprogram_npm/@vant/weapp/toast/toast';
const util = require('../../../utils/util');

Page({

  /**
   * 页面的初始数据
   */
  data: {
    //传参
    paramObj:null,
    //传参来的id
    id:null,
    //是否是修改
    isEdit:false,
    //修改信息回显
    editInfo:{},
    //提交按钮禁用
    disabled:false,
    //日期选择框
    showDate: false,
    //当前日期
    currentDate: new Date().getTime(),
    //最小日期
    minDate: new Date().getTime(),
    //开始时间选择框
    showStartTime: false,
    //结束时间选择框
    showEndTime: false,
    //当前时间
    currentStart: null,
    currentEnd: null,
    //时间格式
    formatter (type, value) {
      if (type === 'year') {
        return `${value}年`
      } else if (type === 'month') {
        return `${value}月`
      } else if (type === 'day') {
        return `${value}日`
      } else if (type === 'hour') {
        return `${value}时`
      } else if (type === 'minute') {
        return `${value}分`
      } else if (type === 'second') {
        return `${value}秒`
      }
      return value
    },
    //人员列表
    list: [],
    //无数据
    showNothing: false,
    //搜索关键词
    searchValue: '',
    //已选中人员
    listMap: null,
    selectUser: []
  }, 

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    wx.getUserProfile({
      desc: '为您提供更好的服务',
      success: (res) => {}
    })

    this.setData({
      listMap: new Map()
    })

    //获取人员列表
    this.getList();

    if(options.paramObj){
      let paramObj=JSON.parse(options.paramObj);
      console.log('加班传参');
      console.log(paramObj);

      this.setData({
        paramObj: paramObj
      })

      //修改时回显信息
      if(paramObj.editInfo){
        let info=paramObj.editInfo;

        this.setData({
          isEdit: true,
          id: info.id,
          editInfo: info,
          currentDateStr: info.startTime.substring(0,10),
          currentStart: info.startTime.substring(11,16),
          currentEnd: info.endTime.substring(11,16),
          self_hours: paramObj.self_hours
        }) 
      }
    }
  },

  //提交表单##
  confirmForm(e){
    //避免表单重复提交-先禁用按钮
    this.setData({
      disabled:true
    })

    let obj=e.detail.value;
    let td=this.data;
    let editInfo=td.editInfo; 
    let user=app.globalData.userInfo;
    let regexp=/(?:\.0*|(\.\d+?)0+)$/;
    let selectList=[];
    let flag=true;

    //日期时间必选
    if(!td.currentDateStr){
      Toast.fail('请选择加班日期');
      return;
    }
    if(!td.currentStart){
      Toast.fail('请选择开始时间');
      return;
    }
    if(!td.currentEnd){
      Toast.fail('请选择结束时间');
      return;
    }

    //结束时间大于开始时间
    if(td.startTime>=td.endTime){
      Toast.fail('结束时间需要大于开始时间');
      return;
    }

    if(editInfo.duration<0.5){ 
      Toast.fail('加班时长至少30分钟');
      return;
    }
    
    if(td.isEdit){
      //修改时验证加班时间段是否重叠
      flag=this.isTimeCross(td.paramObj.imei).then(value => {
        if(value){
          Toast.fail(td.paramObj.name+'在此时间段已有加班，不可重复添加');
        }else{
          //修改时人员只传imei
          selectList=td.editInfo.personnel;
        }
        return !value;
      });  
    }else{
      //添加时，人员必填
      if(td.selectUser.length){     
        td.selectUser.forEach(item => {
          selectList.push({
            id: item.id,
            imei: item.imei,
            name: item.nickName,
            devId: item.devId,
            hitId: item.hitId
          });
        });
      }else{
        Toast.fail('请选择加班人员');
        return;
      }
    }

    //权限
    let authArr=[user.depart, user.departObj[0].companyId];
    authArr=util.arrayRepeatEmpty(authArr);

    Promise.all([flag]).then(value => {
      let passed=value.every(val=>{
        return val;
      });
      if(passed){
        let param={
          id: td.id,
          personnel: selectList,
          startTime: td.currentDateStr+' '+td.currentStart+':00',
          endTime: td.currentDateStr+' '+td.currentEnd+':00',
          //duration: Number(editInfo.duration.toFixed(2).replace(regexp,'$1')),
          duration: Number(editInfo.duration),
          remark: obj.remark.trim(),
          dataAuthority: {
            depart: authArr
          },
          appId: [app.globalData.myAppId]
        }
    
        if(!td.isEdit){
          param.createUserId=user.id;
          param.createUserName=user.userName;
        }
    
        // console.log(param);    
        // return;
    
        //避免表单重复提交
        Toast.loading({
          duration: 0,
          forbidClick: true,
          message: '数据提交中...'
        });

        CommonService.saveWorkOverTime(param).then(res=>{
          this.setData({
            disabled:false
          })
          if (res.statusCode == 200 && res.data.success == true){
            Toast.success('成功');
            setTimeout(() => {
              //返回列表页并查询相应日期的数据    
              let objs={
                date: td.currentDateStr
              }
              wx.reLaunch({
                url: "/packageA/pages/overtimeList/overtimeList?paramObj="+JSON.stringify(objs)
              })
            }, 1000);
          }else{
            Toast.fail('操作失败');
          }
        }).catch((error) => {
          Toast.fail('操作失败');
        })
      }
    });  
  },

  //显示日期选择框
  onShowDate(){
    this.setData({
			showDate: true
    })
  },

  //隐藏日期选择框
  onCloseDate(){
    this.setData({
      showDate: false
    })
  },

  //确认日期
  onConfirmDate(e) {
    this.setData({
      currentDate: e.detail,     
      currentDateStr: util.timeFormatDay(e.detail),
      disabled: false
    })
    this.onCloseDate();  
  },

  //改变日期
  onChangeDate(e){
    let duration='editInfo.duration';
    this.setData({
      currentStart: null,
      currentEnd: null,
      [duration]: null,
      self_hours: null
    })
    let selectUser=this.data.selectUser;
    if(selectUser.length){
      this.setData({
        selectUser: [],
        listMap: new Map()
      })
      this.getList();
    }
  },

  //显示开始时间
  onShowStartTime(){
    if(this.data.currentDateStr){
      this.setData({
        showStartTime: true
      })
    }else{
      Toast.fail('请先选择加班日期');
    }
  },

  //隐藏开始时间
  onCloseStartTime(){
    this.setData({
			showStartTime: false
    })
  },  

  //确认开始时间
  onConfirmStartTime(e) {
    let arr=e.detail.split(':');
    let today=util.timeFormatDay(new Date);
    let h=new Date().getHours();
    let m=new Date().getMinutes();
    let times=null;

    if(this.data.currentDateStr==today){
      let h1=null,m1=null;

      if(arr[0]<h){
        h1 = h>=10 ? h : '0'+h;
      }else{
        h1 = arr[0];
      }

      if(arr[0]<=h && arr[1]<m){
        m1 = m>=10 ? m : '0'+m;
      }else{
        m1 = arr[1];
      } 

      times=h1+':'+m1;
    }else{
      times=e.detail;
    }
    
    this.setData({
      currentStart: times,
      disabled: false
    })
    this.onCloseStartTime();

    //计算加班时长
    this.calculate(); 
  },

  //显示结束时间
  onShowEndTime(){
    if(this.data.currentDateStr){
      this.setData({
        showEndTime: true
      })
    }else{
      Toast.fail('请先选择加班日期');
    }
  },

  //隐藏结束时间
  onCloseEndTime(){
    this.setData({
			showEndTime: false
    })
  },

  //确认结束时间
  onConfirmEndTime(e) {
    let arr=e.detail.split(':');
    let today=util.timeFormatDay(new Date);
    let h=new Date().getHours();
    let m=new Date().getMinutes();
    let times=null;

    if(this.data.currentDateStr==today){
      let h1=null,m1=null;
      
      if(arr[0]<h){
        h1 = h>=10 ? h : '0'+h;
      }else{
        h1 = arr[0];
      }

      if(arr[0]<=h && arr[1]<m){
        m1 = m>=10 ? m : '0'+m;
      }else{
        m1 = arr[1];
      } 

      times=h1+':'+m1;
    }else{
      times=e.detail;
    }
    
    this.setData({
      currentEnd: times,
      disabled: false
    })
    this.onCloseEndTime();

    //计算加班时长
    this.calculate();
  },  

  //改变时间
  onChangeTime(e){
    let selectUser=this.data.selectUser;
    if(selectUser.length){
      this.setData({
        selectUser: [],
        listMap: new Map()
      })
      this.getList();
    }
  },

  //计算加班时长
  calculate(){
    let currentStart=this.data.currentStart;
    let currentEnd=this.data.currentEnd;
    let duration='editInfo.duration';

    if(currentStart && currentEnd){
      let arr1=currentStart.split(":");
      let arr2=currentEnd.split(":");
      let start=arr1[0]*60*60 + arr1[1]*60;
      let end=arr2[0]*60*60 + arr2[1]*60;  

      if(start<end){
        this.setData({
          [duration]: (end-start)/60/60,
          self_hours: util.secondToFormat(end-start)
        })
      }else if(start==end){
        this.setData({
          [duration]: 0,
          self_hours: 0
        })
      }else{
        this.setData({
          [duration]: 0,
          self_hours: null
        })
      } 
    }else{
      this.setData({
        [duration]: 0,
        self_hours: null
      })
    }  
  },

  //获取人员列表
  getList(){
    let param={};

    //模糊查询
    if(this.data.searchValue){
      param.keyword = this.data.searchValue;
    }

    CommonService.findPersonnelAll(param).then(res => {
      if(res.data.data && res.data.data.result && res.data.data.result.length) {
        let result=res.data.data.result;

        //去掉无hitId的人员
        let arr=[];
        result.forEach(item => {
          if(item.hitId){
            arr.push(item);
          }
        });

        //去掉已选人员
        let userList=[];
        let listMap=this.data.listMap;

        if(listMap.size){
          arr.forEach(item => {
            if(!listMap.has(item.imei)){
              userList.push(item);
            }  
          });
        }else{
          userList=arr;
        }  

        this.setData({
          list: userList
        })   
      }else{
        this.setData({
          showNothing: true
        })
        
      }
    }).catch((error) => {
      this.setData({
        showNothing: true
      })
    })
  },

  //刷新人员列表
  refreshListAndPage(){
    this.setData({
      list: [],
      showNothing: false
    })
    this.getList();
  },

  //获取搜索词
  onChangeSearch(e) {
    this.setData({
      searchValue: e.detail
    })
    this.refreshListAndPage();
  }, 

  //点击选择人员
  onClickUser({currentTarget}) {
    if(this.data.currentDateStr && this.data.editInfo.duration && this.data.editInfo.duration>=0.5){
      let detail=currentTarget.dataset.detail;
      let list=this.data.list;
      let selectUser=this.data.selectUser;
      let listMap=this.data.listMap;
      let arr=[];

      //验证是否可以选择（加班时间段不重叠） 
      this.isTimeCross(detail.imei).then(value => {
        if(value){
          Toast.fail(detail.nickName+'在此时间段已有加班，不可重复添加');
        }else{
          selectUser.push(detail);
          listMap.set(detail.imei,detail);

          list.forEach(item => {
            if(item.imei!=detail.imei){
              arr.push(item);
            }
          });
    
          this.setData({
            list: arr,
            selectUser: selectUser,
            listMap: listMap,
            disabled: false
          })
        }

      });
    }else{
      Toast.fail('请选择正确的日期和时间，加班时长至少30分钟');
    }  
  },

  //删除选中的人员
  onDeleteUser({currentTarget}){
    let detail=currentTarget.dataset.detail;
    let list=this.data.list;
    let selectUser=this.data.selectUser; 
    let listMap=this.data.listMap;   
    let arr=[];

    //删除map中数据
    listMap.delete(detail.imei);

    //删除已选列表数据，加入人员列表
    selectUser.forEach(item => {
      if(item.imei==detail.imei){
        list.push(item);
      }else{
        arr.push(item);
      }
    });

    this.setData({
      list: list,
      selectUser: arr
    })
  },  

  //查询加班情况，判断时间段是否重叠
  isTimeCross(imei){
    let param={
      imei: imei,
      day: this.data.currentDateStr
    }

    return new Promise((resolve, reject) => {
      CommonService.findWorkOverRecord(param).then(res=>{
        if (res.data.data && res.data.data.result && res.data.data.result.length) {
          let result=res.data.data.result;  
          let arr1=[];
          let arr2=[];
          let flag=false;

          result.forEach(item => {
            if(item.workOverRecord && item.workOverRecord.length){
              arr1=arr1.concat(item.workOverRecord);
            }	
          });

          //如果是修改成今天的数据，则去掉当前这条记录，不作比较
          if(this.data.isEdit){
            arr1.forEach(item => {
              if(item.id!=this.data.id){
                arr2.push(item);
              }
            });
          }else{
            arr2=arr1;
          }
          
          if(arr2.length){
            //处理时间格式并分别放入数组
            let currentStart=this.data.currentStart.replace(':','');
            let currentEnd=this.data.currentEnd.replace(':','');
            let sArr=[currentStart];
            let eArr=[currentEnd];

            arr2.forEach(item => {
              if(item.startTime && item.endTime){   
                let start=item.startTime.substring(11,16).replace(':',''); 
                sArr.push(start);
                let end=item.endTime.substring(11,16).replace(':','');      
                eArr.push(end);               
              }	
            }); 

            //排序
            sArr=sArr.sort();
            eArr=eArr.sort();

            //时间段是否重复
            for(let i=1;i<sArr.length;i++){
              if(sArr[i] < eArr[i-1]){
                flag=true;                
                break;
              }
            }             
          }

          resolve(flag);
        } else {
          resolve(false);
        }
      }).catch((error) => {
        resolve(false);
      })
    });  
  },

  //用户输入时按钮可用
  clearMessage() {
    this.setData({
      disabled: false
    })
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {

  },

  /**
   * 生命周期函数--监听页面显示
   */
  onShow: function () {

  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {

  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {

  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {

  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {

  }
})